package com.example.myblog.repository;

import com.example.myblog.model.TreasureItem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 百宝箱项目数据访问接口
 */
@Repository
public interface TreasureItemRepository extends JpaRepository<TreasureItem, Long> {

    /**
     * 查找所有启用的项目，按显示顺序排序
     */
    List<TreasureItem> findByEnabledTrueOrderByDisplayOrderAscCreatedAtDesc();

    /**
     * 查找所有项目，按显示顺序排序（管理后台使用）
     */
    List<TreasureItem> findAllByOrderByDisplayOrderAscCreatedAtDesc();

    /**
     * 根据类型查找启用的项目
     */
    List<TreasureItem> findByTypeAndEnabledTrueOrderByDisplayOrderAscCreatedAtDesc(TreasureItem.ItemType type);

    /**
     * 根据类型查找所有项目（管理后台使用）
     */
    List<TreasureItem> findByTypeOrderByDisplayOrderAscCreatedAtDesc(TreasureItem.ItemType type);

    /**
     * 查找指定创建者的项目
     */
    List<TreasureItem> findByCreatedByOrderByDisplayOrderAscCreatedAtDesc(Long createdBy);

    /**
     * 根据显示名称模糊查询
     */
    List<TreasureItem> findByDisplayNameContainingIgnoreCaseAndEnabledTrueOrderByDisplayOrderAscCreatedAtDesc(String displayName);

    /**
     * 获取最大显示顺序
     */
    @Query("SELECT COALESCE(MAX(t.displayOrder), 0) FROM TreasureItem t")
    Integer findMaxDisplayOrder();

    /**
     * 统计启用的项目数量
     */
    long countByEnabledTrue();

    /**
     * 根据类型统计启用的项目数量
     */
    long countByTypeAndEnabledTrue(TreasureItem.ItemType type);

    /**
     * 检查URL是否已存在（用于网站收藏去重）
     */
    boolean existsByUrlAndEnabledTrue(String url);

    /**
     * 检查文件路径是否已存在（用于文件去重）
     */
    boolean existsByFilePathAndEnabledTrue(String filePath);

    /**
     * 根据文件路径查找项目
     */
    TreasureItem findByFilePath(String filePath);

    /**
     * 根据URL查找项目
     */
    TreasureItem findByUrl(String url);

    /**
     * 更新显示顺序
     */
    @Query("UPDATE TreasureItem t SET t.displayOrder = :displayOrder WHERE t.id = :id")
    void updateDisplayOrder(@Param("id") Long id, @Param("displayOrder") Integer displayOrder);
}